--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_diagnostics_safeguards.py 3f7ef731b5effd9aa3a81eceea66fd6c2b56498c (3f7ef731) Text, 6.34 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787logging
Tff7b72import T7ee787sys
Tff7b72import T7ee787threading
Tff7b72import T7ee787unittest
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMock
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787diagnostics Tff7b72import Te6edf3MemoryDiagnostics
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787persistent_log_handler Tff7b72import Te6edf3PersistentLogHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787recoveryT7ee787.T7ee787crash_recovery Tff7b72import Te6edf3CrashRecovery
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787recoveryT7ee787.T7ee787health_monitor Tff7b72import Te6edf3HealthMonitor
Tff7b72class T56d364TestMemoryDiagnosticsBoundingTb4b4b4(Te6edf3unittestTff7b72.Td2a8ffTestCaseTb4b4b4)Tb4b4b4:
T8b949e"""The leak detector must not itself leak by retaining every snapshot."""
Tff7b72def Td2a8fftest_snapshots_are_bounded_and_baseline_preservedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3diag Tff7b72= Te6edf3MemoryDiagnosticsTb4b4b4(Te6edf3max_snapshotsTff7b72=T79c0ff4Tb4b4b4)
Te6edf3diagTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3baseline Tff7b72= Te6edf3diagTff7b72.Td2a8ff_snapshotsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72for Te6edf3_ Tff7b72in Tffa657rangeTb4b4b4(T79c0ff30Tb4b4b4)Tb4b4b4:
Te6edf3diagTff7b72.Td2a8ffsnapshotTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertLessEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3diagTff7b72.Td2a8ff_snapshotsTb4b4b4)Tb4b4b4, T79c0ff4Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertLessEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3diagTff7b72.Td2a8ff_gc_statsTb4b4b4)Tb4b4b4, T79c0ff4Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertIsTb4b4b4(Te6edf3diagTff7b72.Td2a8ff_snapshotsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3baselineTb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3diagTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_total_snapshots_is_monotonicTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3diag Tff7b72= Te6edf3MemoryDiagnosticsTb4b4b4(Te6edf3max_snapshotsTff7b72=T79c0ff4Tb4b4b4)
Te6edf3diagTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72for Te6edf3_ Tff7b72in Tffa657rangeTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4:
Te6edf3diagTff7b72.Td2a8ffsnapshotTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3diagTff7b72.Td2a8fftotal_snapshotsTb4b4b4, T79c0ff11Tb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3diagTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_type_tracker_history_is_boundedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3diag Tff7b72= Te6edf3MemoryDiagnosticsTb4b4b4(Te6edf3max_snapshotsTff7b72=T79c0ff4Tb4b4b4)
Te6edf3diagTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72for Te6edf3_ Tff7b72in Tffa657rangeTb4b4b4(T79c0ff20Tb4b4b4)Tb4b4b4:
Te6edf3diagTff7b72.Td2a8ffsnapshotTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertLessEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3diagTff7b72.Td2a8ff_type_trackerTff7b72.Td2a8ff_historyTb4b4b4)Tb4b4b4, T79c0ff4Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(Te6edf3diagTff7b72.Td2a8ff_type_trackerTff7b72.Td2a8ff_firstTb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3diagTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_reset_clears_history_and_counterTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3diag Tff7b72= Te6edf3MemoryDiagnosticsTb4b4b4(Te6edf3max_snapshotsTff7b72=T79c0ff4Tb4b4b4)
Te6edf3diagTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3diagTff7b72.Td2a8ffsnapshotTb4b4b4(Tb4b4b4)
Te6edf3diagTff7b72.Td2a8ffresetTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3diagTff7b72.Td2a8fftotal_snapshotsTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3diagTff7b72.Td2a8ff_snapshotsTb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3diagTff7b72.Td2a8ff_gc_statsTb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72class T56d364TestPersistentLogFilterParityTb4b4b4(Te6edf3unittestTff7b72.Td2a8ffTestCaseTb4b4b4)Tb4b4b4:
T8b949e"""In-memory fallback must apply the same filters as the database path."""
Tff7b72def Td2a8ffsetUpTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhandler Tff7b72= Te6edf3PersistentLogHandlerTb4b4b4(Te6edf3flush_intervalTff7b72=T79c0ff999Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8fflogs_bufferTff7b72.Td2a8ffextendTb4b4b4(
Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: T79c0ff1.0Tb4b4b4,
Ta5d6ff"Ta5d6fflevelTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffINFOTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmoduleTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffalphaTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffhello worldTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffis_anomalyTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffanomaly_typeTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: T79c0ff2.0Tb4b4b4,
Ta5d6ff"Ta5d6fflevelTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffERRORTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmoduleTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbetaTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffboomTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffis_anomalyTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffanomaly_typeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffrepeatTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_module_filter_applied_in_fallbackTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3logs Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_logsTb4b4b4(Te6edf3moduleTff7b72=Ta5d6ff"Ta5d6ffalphaTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Te6edf3logsTb4b4b4)Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3logsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffmoduleTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffalphaTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_total_count_respects_filtersTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_total_countTb4b4b4(Te6edf3levelTff7b72=Ta5d6ff"Ta5d6ffERRORTa5d6ff"Tb4b4b4)Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_total_countTb4b4b4(Te6edf3is_anomalyTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffget_total_countTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff2Tb4b4b4)
Tff7b72def Td2a8fftest_emit_survives_anomaly_detector_failureTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ff_detect_anomaly Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3side_effectTff7b72=Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffboomTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3record Tff7b72= Te6edf3loggingTff7b72.Td2a8ffLogRecordTb4b4b4(
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4,
Te6edf3levelTff7b72=Te6edf3loggingTff7b72.Td2a8ffINFOTb4b4b4,
Te6edf3pathnameTff7b72=Tff7b72__file__Tb4b4b4,
Te6edf3linenoTff7b72=T79c0ff1Tb4b4b4,
Te6edf3msgTff7b72=Ta5d6ff"Ta5d6ffresilientTa5d6ff"Tb4b4b4,
Te6edf3argsTff7b72=Tb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3exc_infoTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8ffemitTb4b4b4(Te6edf3recordTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8fflogs_bufferTb4b4b4)Tb4b4b4, T79c0ff3Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhandlerTff7b72.Td2a8fflogs_bufferTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffresilientTa5d6ff"Tb4b4b4)
Tff7b72class T56d364TestCrashRecoveryThreadHookTb4b4b4(Te6edf3unittestTff7b72.Td2a8ffTestCaseTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffsetUpTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrecovery Tff7b72= Te6edf3CrashRecoveryTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_orig_sys Tff7b72= Te6edf3sysTff7b72.Td2a8ffexcepthook
Tff7b72selfTff7b72.Td2a8ff_orig_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffexcepthook
Tff7b72def Td2a8fftearDownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3sysTff7b72.Td2a8ffexcepthook Tff7b72= Tff7b72selfTff7b72.Td2a8ff_orig_sys
Te6edf3threadingTff7b72.Td2a8ffexcepthook Tff7b72= Tff7b72selfTff7b72.Td2a8ff_orig_thread
Tff7b72def Td2a8fftest_install_sets_threading_hookTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffinstallTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3threadingTff7b72.Td2a8ffexcepthookTb4b4b4, Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ff_handle_thread_exceptionTb4b4b4)
Tff7b72def Td2a8fftest_disable_restores_threading_hookTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3original Tff7b72= Te6edf3threadingTff7b72.Td2a8ffexcepthook
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffinstallTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffdisableTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3threadingTff7b72.Td2a8ffexcepthookTb4b4b4, Te6edf3originalTb4b4b4)
Tff7b72def Td2a8fftest_thread_exception_does_not_exit_processTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3orig_exit Tff7b72= Te6edf3sysTff7b72.Td2a8ffexit
Te6edf3sysTff7b72.Td2a8ffexit Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3args Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3argsTff7b72.Td2a8ffexc_type Tff7b72= Tf85149ValueError
Te6edf3argsTff7b72.Td2a8ffexc_value Tff7b72= Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffworker diedTa5d6ff"Tb4b4b4)
Te6edf3argsTff7b72.Td2a8ffexc_traceback Tff7b72= Tff7b72None
Te6edf3argsTff7b72.Td2a8ffthread Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffworkerTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ff_handle_thread_exceptionTb4b4b4(Te6edf3argsTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3sysTff7b72.Td2a8ffexit Tff7b72= Te6edf3orig_exit
Tff7b72def Td2a8fftest_reentrancy_guard_prevents_recursionTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3calls Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffdefaultTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4}
Tff7b72def Td2a8fffake_defaultTb4b4b4(Te6edf3etTb4b4b4, Te6edf3evTb4b4b4, Te6edf3tbTb4b4b4)Tb4b4b4:
Te6edf3callsTb4b4b4[Ta5d6ff"Ta5d6ffdefaultTa5d6ff"Tb4b4b4] Tff7b72+Tff7b72= T79c0ff1
Te6edf3orig_default Tff7b72= Te6edf3sysTff7b72.Td2a8ff__excepthook__
Te6edf3sysTff7b72.Td2a8ff__excepthook__ Tff7b72= Te6edf3fake_default
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ff_handling Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ffhandle_exceptionTb4b4b4(
Tf85149ValueErrorTb4b4b4,
Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4)Tb4b4b4,
Tff7b72NoneTb4b4b4,
Te6edf3exit_processTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3callsTb4b4b4[Ta5d6ff"Ta5d6ffdefaultTa5d6ff"Tb4b4b4]Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72finallyTb4b4b4:
Te6edf3sysTff7b72.Td2a8ff__excepthook__ Tff7b72= Te6edf3orig_default
Tff7b72selfTff7b72.Td2a8ffrecoveryTff7b72.Td2a8ff_handling Tff7b72= Tff7b72False
Tff7b72class T56d364TestHealthMonitorStopTb4b4b4(Te6edf3unittestTff7b72.Td2a8ffTestCaseTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8fftest_stop_signals_and_joinsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3monitor Tff7b72= Te6edf3HealthMonitorTb4b4b4(Te6edf3log_handlerTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3appTff7b72=Tff7b72NoneTb4b4b4)
Te6edf3monitorTff7b72.Td2a8fflog_handlerTff7b72.Td2a8ffcurrent_log_entropy Tff7b72= T79c0ff0.1
Te6edf3monitorTff7b72.Td2a8fflog_handlerTff7b72.Td2a8ffcurrent_error_rate Tff7b72= T79c0ff0.0
Te6edf3monitorTff7b72.Td2a8ffCHECK_INTERVAL Tff7b72= T79c0ff0.05
Te6edf3monitorTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(Te6edf3monitorTff7b72.Td2a8ff_runningTb4b4b4)
Te6edf3monitorTff7b72.Td2a8ffstopTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff2.0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertFalseTb4b4b4(Te6edf3monitorTff7b72.Td2a8ff_runningTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertTrueTb4b4b4(Te6edf3monitorTff7b72.Td2a8ff_stop_eventTff7b72.Td2a8ffis_setTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3monitorTff7b72.Td2a8ff_thread Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffassertFalseTb4b4b4(Te6edf3monitorTff7b72.Td2a8ff_threadTff7b72.Td2a8ffis_aliveTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3unittestTff7b72.Td2a8ffmainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────